<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="height: 100%;">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta http-equiv="X-UA-Compatible" content="chrome=1">

<link rel="shortcut icon" type="image/x-icon" href="sites-16.ico">
<link rel="apple-touch-icon" href="https://ssl.gstatic.com/sites/p/1e8f4b/system/app/images/apple-touch-icon.png" type="image/png">








<!--[if IE]>
          <link rel="stylesheet" type="text/css" href="/a/monkeyspeak.com/monkeyspeak%2ddocuments/system/app/css/camelot/allthemes%2die.css" />
        <![endif]-->
<title>Computing Memory Alignment - MonkeySpeak Documents</title>

<link href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/computing-memory-alignment" rel="canonical">
<link rel="stylesheet" type="text/css" href="index.css" media="all">
</head>
<body style="position: relative; min-height: 100%; top: 0px;" xmlns="http://www.google.com/ns/jotspot" id="body" class=" en            ">
<div id="sites-page-toolbar" class="sites-header-divider">
<div xmlns="http://www.w3.org/1999/xhtml" id="sites-status" class="sites-status" style="display: none;"><div id="sites-notice" class="sites-notice" role="status" aria-live="assertive"> </div></div>
</div>
<div id="sites-chrome-everything-scrollbar">
<div id="sites-chrome-everything">
<div id="sites-chrome-page-wrapper" style="direction: ltr;">
<div id="sites-chrome-page-wrapper-inside">
<div xmlns="http://www.w3.org/1999/xhtml" id="sites-chrome-header-wrapper">
<table id="sites-chrome-header" class="sites-layout-hbox" cellspacing="0">
<tbody><tr class="sites-header-primary-row">
<td id="sites-header-title">
<div class="sites-header-cell-buffer-wrapper">
<a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/">
<img src="logo.gif" id="logo-img-id" alt="Logo" class="sites-logo">
</a>
<h2>
<a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/" dir="ltr">MonkeySpeak Documents</a>
</h2>
</div>
</td>
<td class="sites-layout-searchbox">
<div class="sites-header-cell-buffer-wrapper">
<div>
<form id="sites-searchbox-form" action="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/system/app/pages/search"><input id="sites-searchbox-scope" name="scope" value="search-site" type="hidden"><input id="jot-ui-searchInput" name="q" size="20" value="" aria-label="Search this site" autocomplete="off" type="text"><div id="sites-searchbox-button-set" class="goog-inline-block"><div style="-moz-user-select: none;" role="button" id="sites-searchbox-search-button" class="goog-inline-block jfk-button jfk-button-standard" tabindex="0">Search this site</div></div></form>
</div>
</div>
</td>
</tr>
<tr class="sites-header-secondary-row">
<td colspan="2">
</td>
</tr>
</tbody></table> 
</div> 
<div id="sites-chrome-main-wrapper">
<div id="sites-chrome-main-wrapper-inside">
<table id="sites-chrome-main" class="sites-layout-hbox" cellspacing="0">
<tbody><tr>
<td id="sites-chrome-sidebar-left" class="sites-layout-sidebar-left">
<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_2bd" class="sites-embed">
<div class="sites-embed-content sites-sidebar-nav ">
<ul jotid="navList">
<li class="nav-first"><div dir="ltr" style="padding-left: 5px;"><a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/home" jotid="wuid:gx:127494f98bdba4f7" class="sites-navigation-link">Home</a>
</div></li>
<li class=""><div class="current-bg" jotid="wuid:gx:23573117c18a2026" dir="ltr" style="padding-left: 5px;">Computing Memory Alignment
</div></li>
<li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/western-music-from-first-principles" jotid="wuid:gx:24e6d74117842d6a" class="sites-navigation-link">Western Music From First Principles</a>
</div></li>
<li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/system/app/pages/sitemap/hierarchy" jotid="wuid:gx:5e0e063b8f89cd1b" class="sites-navigation-link">Sitemap</a>
</div></li>
</ul>
</div>
</div>
</td>
<td id="sites-canvas-wrapper">
<div id="sites-canvas">
<div id="goog-ws-editor-toolbar-container"> </div>
<div xmlns="http://www.w3.org/1999/xhtml" id="title-crumbs" style="">
</div>
<h3 xmlns="http://www.w3.org/1999/xhtml" id="sites-page-title-header" style="" align="left">
<span id="sites-page-title" dir="ltr">Computing Memory Alignment</span>
</h3>
<div id="sites-canvas-main" class="sites-canvas-main">
<div id="sites-canvas-main-content">
<table xmlns="http://www.w3.org/1999/xhtml" class="sites-layout-name-one-column sites-layout-hbox" cellspacing="0"><tbody><tr><td class="sites-layout-tile sites-tile-name-content-1"><div dir="ltr"><center style="color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><h3 style="font-weight: normal; color: rgb(102, 97, 84); font-size: 1.4em;"><a name="TOC-Computing-Memory-Alignment-Restrict"></a>Computing Memory Alignment Restrictions of Data Types in C and C++</h3><h3 style="font-weight: normal; color: rgb(102, 97, 84); font-size: 1.4em;"><a name="TOC-Tom-Lokovic" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>Tom Lokovic</h3><h3 style="font-weight: normal; color: rgb(102, 97, 84); font-size: 1.4em;"><a name="TOC-July-2003" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>July 2003</h3></center><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-ABSTRACT" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>ABSTRACT</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">When implementing a dynamic object system in which structures of heterogenous data are assembled at runtime, one must respect memory alignment restrictions of the hardware. Since alignment restrictions are different from one platform to the next, this imposes a portability problem. This paper describes a portable method for computing alignment restrictions of data types in C and C++.</p><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-BACKGROUND" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>BACKGROUND</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Modern computer hardware is byte-addressed: the address space is broken up into bytes, and any pointer may reference any individual byte. A value which consists of one byte may be placed anywhere in memory. However, most hardware architectures impose restrictions on larger data types. Specifically, a multi-byte value may be constrained to appear at only certain memory locations.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">This restriction is often called&nbsp;<i>memory alignment</i>: the multi-byte value may only appear at memory locations which are integer multiples of some number. In this paper, we call that number the&nbsp;<i>stride</i>&nbsp;of the data type. The stride may vary between different data types on one platform, and between the same type on different platforms.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Most programs in C and C++ need not worry about alignment restrictions. This is because compilers know enough about the platform to arrange values so that they all align properly. As long as a program restricts itself to simple structs and classes, and as long as it does not attempt to place values at arbitrary memory locations, the programmer need not worry about alignment issues.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">However, some programs cannot be so restrictive. In particular, if a program needs to assemble structs dynamically--that is, determine at runtime which types are needed and then arrange them on the fly--then native structs and classes are insufficient. The program must perform its own "packing" of structured data, which also means it must take care to respect alignment.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">While C and C++ compilers always know about the alignment restrictions of the underlying platform, there is no formal mechanism to ask the compiler about those restrictions. This paper offers a portable way to "trick" the compiler into revealing what it knows about alignment.</p><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-THE-TECHNIQUE" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>THE TECHNIQUE</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">C and C++ provide a built-in operator&nbsp;<tt>sizeof()</tt>, which returns the size of a data type in bytes. We seek a similar operator,&nbsp;<tt>strideof()</tt>, which returns the type's alignment stride in bytes.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Here is such an operator, implemented with a template and a macro:</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;"><tt>
   template &lt;typename T&gt;
   struct Tchar {
       T t;
       char c;
   };

   #define strideof(T)                             \
      ((sizeof(Tchar&lt;T&gt;) &gt; sizeof(T)) ?            \
        sizeof(Tchar&lt;T&gt;)-sizeof(T) : sizeof(T))
</tt></pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">It may not be immediately obvious why this works, or even what this code has to do with alignment. Before we get into the details, though, let's consider the advantages and disadvantages of this technique.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Advantages:</p><ul style="color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><li style="list-style-position: outside; list-style-type: circle;">It works for any type, including native types (eg,&nbsp;<tt>short</tt>,&nbsp;<tt>double</tt>), struct types, and class types.</li><li style="list-style-position: outside; list-style-type: circle;">Its computation can be performed at compile-time via constant folding, and thus (like&nbsp;<tt>sizeof()</tt>) it incurs no runtime cost at all.</li></ul><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Disadvantages:</p><ul style="color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><li style="list-style-position: outside; list-style-type: circle;">The macro uses C++ templates, which are not available in C. The basic technique (subtracting&nbsp;<tt>T</tt>'s size from the size of a special struct) works equally well in C, but without templates there's no way to provide a general macro like&nbsp;<tt>strideof()</tt>.</li><li style="list-style-position: outside; list-style-type: circle;">While this technique is always guaranteed to give a result that is safe to use, and in practice does give the right answer, it's not strictly guaranteed to give&nbsp;<tt>T</tt>'s true stride. More on that later.</li><li style="list-style-position: outside; list-style-type: circle;">Unlike&nbsp;<tt>sizeof()</tt>,which is a built-in operator, the&nbsp;<tt>strideof()</tt>&nbsp;macro can only take a type as its argument--not an instance.</li></ul><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-HOW-IT-WORKS:" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>HOW IT WORKS:</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Consider a type&nbsp;<tt>T</tt>&nbsp;for which we wish to compute the stride. The stride constrains the memory locations at which an instance of&nbsp;<tt>T</tt>&nbsp;may begin. (Here, each&nbsp;<tt>^</tt>&nbsp;represents a memory location at which&nbsp;<tt>T</tt>&nbsp;may appear; the spacing between them is the stride we seek.)</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;">   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
</pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Now consider a hypothetical instance of&nbsp;<tt>T</tt>&nbsp;in memory. It has&nbsp;<tt>sizeof(T)</tt>&nbsp;bytes, and must begin at some multiple of&nbsp;<tt>T</tt>'s stride. We also know (from the proof in Appendix 1 below) that&nbsp;<tt>sizeof(T)</tt>&nbsp;is an integer multiple of&nbsp;<tt>T</tt>'s stride. Unfortunately, we don't know&nbsp;<i>which</i>&nbsp;multiple it is, and so we still don't know the stride.</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;">       tttttttttttt
   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
</pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Now suppose that, instead of a&nbsp;<tt>T</tt>, we have a struct&nbsp;<tt>Tchar</tt>&nbsp;which contains both a&nbsp;<tt>T</tt>&nbsp;and a&nbsp;<tt>char</tt>. There are several ways in which the compiler may choose to arrange the struct, and this technique works equally well with all of them. For now, we'll assume it does what most compilers do: place the&nbsp;<tt>char</tt>&nbsp;immediately after the&nbsp;<tt>T</tt>:</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;">       ttttttttttttc
   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
</pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">However, the compiler cannot leave the struct quite like this. For alignment reasons, the compiler will bump the size of&nbsp;<tt>Tchar</tt>&nbsp;up to some multiple of&nbsp;<tt>T</tt>'s stride--probably the next multiple. It must do this regardless of the order in which it arranges the elements and the padding. For a proof, See Appendix 2.</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;">       ttttttttttttc###
   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
</pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Now, if we subtract the size of&nbsp;<tt>T</tt>&nbsp;from the size of&nbsp;<tt>Tchar</tt>, we get some integer multiple of&nbsp;<tt>T</tt>'s stride. In this case (and in the common case), we get&nbsp;<tt>T</tt>'s stride exactly.</p><blockquote style="font-style: italic; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><pre style="margin: 0px;">       ttttttttttttc###
   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
                   &lt;---
</pre></blockquote><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">There are two cases in which we might not get&nbsp;<tt>T</tt>'s stride exactly. The first is if the compiler (for some reason) chooses to pad the struct too much. In that case,&nbsp;<tt>Tchar</tt>'s size will be bumped up to some higher multiple of&nbsp;<tt>T</tt>'s stride. The result we get is not optimal, but it's still guaranteed to be safe to use. Such excessive padding should probably be considered a bug in the compiler, but our technique deals safely with that case anyway.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">The second case is if&nbsp;<tt>T</tt>&nbsp;already has some padding in it, and the compiler chooses to reuse some of&nbsp;<tt>T</tt>'s padding to store the extra&nbsp;<tt>char</tt>. In that case,&nbsp;<tt>Tchar</tt>&nbsp;will be the same size as&nbsp;<tt>T</tt>, and our subtraction will yield zero. When that happens, our macro defaults to&nbsp;<tt>sizeof(T)</tt>, which is not optimal but is at least known to be a multiple of&nbsp;<tt>T</tt>'s stride. (There is some dispute as to whether this case can arise--some believe that it is illegal for a compiler to reuse padding like this. Either way, our technique deals with it.)</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Note that this technique has more to do with the compiler's alignment strategy than the hardware's actual restrictions. For example, some architectures do not&nbsp;<i>prohibit</i>&nbsp;misaligned values, but instead incur some performance penalty when operating on misaligned values. If a compiler is configured to allow misaligned values (to save space at the cost of some performance), then our technique will reflect that alignment strategy.</p><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-APPENDIX-1" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>APPENDIX 1</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Claim: For every type&nbsp;<tt>T</tt>,&nbsp;<tt>sizeof(T)</tt>&nbsp;is an integer multiple of&nbsp;<tt>T</tt>'s stride&nbsp;<tt>S</tt>.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Proof:</p><ol style="list-style-type: decimal; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><li>By definition, instances of&nbsp;<tt>T</tt>&nbsp;may only begin at memory addresses which are integer multiples of&nbsp;<tt>S</tt>.&nbsp;</li><li>C and C++ guarantee that every datatype is "tilable". That is, if an instance of&nbsp;<tt>T</tt>&nbsp;appears at a legal address&nbsp;<tt>a</tt>, then it is always legal (alignment-wise) for another instance to appear at&nbsp;<tt>a+sizeof(T)</tt>. This is what makes arrays possible.</li><li>Given any two instances of&nbsp;<tt>T</tt>&nbsp;in memory, the difference between their addresses is an integer multiple of&nbsp;<tt>S</tt>. (This is clearly true since, from&nbsp;<i>i</i>, both addresses are integer multiples of&nbsp;<tt>S</tt>.)</li><li>Suppose&nbsp;<tt>A</tt>&nbsp;is an instance of type&nbsp;<tt>T</tt>&nbsp;which appears at address&nbsp;<tt>a</tt>. By&nbsp;<i>ii</i>, it is legal to place another instance at address&nbsp;<tt>a+sizeof(T)</tt>. And by&nbsp;<i>iii</i>, we know&nbsp;<tt>(a+sizeof(T))-a</tt>&nbsp;is an integer multiple of&nbsp;<tt>S</tt>.</li><li>Thus,&nbsp;<tt>sizeof(T)</tt>&nbsp;is an integer multiple of&nbsp;<tt>S</tt>.</li></ol><h3 style="font-weight: normal; color: rgb(0, 0, 0); font-size: medium; font-family: Times;"><a name="TOC-APPENDIX-2" style="color: rgb(141, 161, 173); text-decoration: underline;"></a>APPENDIX 2</h3><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Claim: For every struct type&nbsp;<tt>T</tt>,&nbsp;<tt>sizeof(T)</tt>&nbsp;is an integer multiple of the stride of each of T's members.</p><p style="margin: 0px; color: rgb(0, 0, 0); font-family: Times; font-size: medium;">Proof:</p><ol style="list-style-type: decimal; color: rgb(0, 0, 0); font-family: Times; font-size: medium;"><li>Suppose&nbsp;<tt>A</tt>&nbsp;is an instance of type&nbsp;<tt>T</tt>&nbsp;at address&nbsp;<tt>a</tt>.</li><li>From&nbsp;<i>ii</i>, it is legal to place an instance&nbsp;<tt>B</tt>&nbsp;of type&nbsp;<tt>T</tt>&nbsp;at address&nbsp;<tt>a+sizeof(T)</tt>.</li><li>Given any element inside struct&nbsp;<tt>T</tt>, the difference between its address in&nbsp;<tt>B</tt>&nbsp;and its address in&nbsp;<tt>A</tt>&nbsp;is&nbsp;<tt>sizeof(T)</tt>.</li><li>But from&nbsp;<i>iii</i>, that difference is also an integer multiple of the element's stride.</li><li>Thus,&nbsp;<tt>sizeof(T)</tt>&nbsp;is an integer multiple of the element's stride.</li></ol></div></td></tr></tbody></table>
</div> 
</div> 
<div id="sites-canvas-bottom-panel">
<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_page-subpages"> </div>
<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_page-attachments">
<div id="sites-attachment-wrapper" class="sites-canvas-bottom-panel-wrapper">
<div jotid="sites-attachment-inner" class="sites-attachment-inner">
<ul id="JOT_ATTACH_container">
</ul>
</div>
</div>
</div>
<a xmlns="http://www.w3.org/1999/xhtml" name="page-comments"></a>
<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_page-comments" style="display: none;" class="sites-canvas-bottom-no-items">
<div id="sites-comment-wrapper" class="sites-canvas-bottom-panel-wrapper">
<div>
<h3 id="sites-comment-header">
<strong>Comments</strong>
</h3>
</div>
<div id="sites-comment-inner" class="sites-comment-inner">
<div jotid="comments" class="sites-comments">
<div id="_wuid_" jotid="template" class="sites-comment" style="display: none;">
<div><strong>_displayNameOrEmail_</strong> - _time_ - <a href="javascript:;" onclick="JOT_postEvent('removeComment', this, {wuid:'_wuid_'});">Remove</a></div>
<p dir="_dir_">_text_</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div> 
</td> 
</tr>
</tbody></table> 
</div> 
</div> 
<div id="sites-chrome-footer-wrapper">
<div id="sites-chrome-footer-wrapper-inside">
<div id="sites-chrome-footer">
</div>
</div>
</div>
</div> 
</div> 
<div xmlns="http://www.w3.org/1999/xhtml" class="sites-adminfooter">
<p>
<a href="https://www.google.com/a/SelectSession?continue=https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/computing-memory-alignment&amp;service=jotspot" class="sites-system-link">Войти</a>
                    &nbsp;|&nbsp;
                  
                
                    <a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/system/app/pages/recentChanges" rel="nofollow" class="sites-system-link">Последние изменения на сайте</a>
                    &nbsp;|&nbsp;
                  
                
                <a href="http://www.google.com/a/help/intl/ru/users/terms.html" class="sites-system-link">Условия использования</a>
                &nbsp;|&nbsp;
                <a href="https://sites.google.com/a/monkeyspeak.com/monkeyspeak-documents/system/app/pages/reportAbuse?src=/computing-memory-alignment" rel="nofollow" target="_top" class="sites-system-link">Сообщить о нарушении</a>
                &nbsp;|&nbsp;
                
                    <a href="javascript:;" onclick="window.open(webspace.printUrl)" class="sites-system-link">Распечатать страницу</a>
                    &nbsp;|&nbsp;
                  
                
              
            <b class="powered-by">Технология: <a href="http://sites.google.com/">Сайты Google </a></b>
</p>

</div>
</div> 
</div> 
<div id="sites-chrome-onebar-footer">
</div>


















<div id="server-timer-div" style="display: none;"> </div>
<div id="goog-gt-tt" class="skiptranslate"><div class="top"><div class="title left">Original Text:</div><a class="close-button" href="javascript:void(0)" title="Close"><img src="cleardot.gif" style="background-image: url('te_ctrl3.gif'); background-position: -28px 0px;" height="15" width="15"></a></div><div class="middle"><div class="original-text"></div></div><div class="bottom"><div class="activity-links"><span class="activity-link">Показать альтернативный перевод</span></div><div class="started-activity-container"><hr style="color: rgb(204, 204, 204); background-color: rgb(204, 204, 204); height: 1px; border: medium none;"><div class="activity-root"></div></div><div class="logo"><img src="mini_google.png"></div></div><div style="display: none;" class="status-message"></div></div>


<div style="position: absolute; top: -1000px; height: 1px; width: 1px;"><object id="fI0gw55yj9p" name="fI0gw55yj9p" type="application/x-shockwave-flash" data="hrs.swf" height="500" width="400"><param name="allowScriptAccess" value="always"></object></div><div class=" goog-te-ftab-float" id=":0.floatContainer" style="-moz-box-sizing: content-box; width: 90px; height: 24px;"><iframe id=":0.container" src="index_1.html" class="goog-te-ftab-frame skiptranslate" style="visibility: visible; -moz-box-sizing: content-box; width: 90px; height: 24px;" frameborder="0"></iframe></div></body>
</html>
